let { wsPort } = require('../config/index.js');
let {insetMsg} = require('../controller/msg.controller');
let {UpdateUserState} = require('../controller/user.controller')
// 存储当前会话链接:一个会话为私聊模式，两名用户参与
let Connects = new Map();
// 开启服务
// 创建websocket服务器
let WebSocket = require('ws');
let server = new WebSocket.Server({ port: wsPort })
// 监听事件
server.on('open', (data) => {
    console.log('open-----', data)

})
// 监听连接是否成功
server.on('connection', async (client, req) => {
    // 获取客户端信息
    const ip = client._socket.remoteAddress
    const port = client._socket.remotePort
    console.log(ip,+'----'+port)
    // 监听消息
    client.on('message', (data, isBinary) => {
        // ws收到的消息为buffer格式，先将buffer转化为string
        let result = JSON.parse(data.toString());
        // 存储当前用户链接
        handelCurrConnect(result,client);
        // 发送该条消息toUserID
        handelMsg(result);
    });
    // 监听客户端链接断开
    client.on('close',async function(data){
        let {userID} = client;
        // 移除client
        Connects.delete(userID);
        // 修改当前用户为离线状态
        UpdateUserState(userID,0).then(()=>{
            console.log('用户离线状态修改成功-----')
            // 有客户端上线成功-广播用户下线消息
            BroadCastMsg({flag:'user_connect'});
        });
       // console.log('客户端数量-----',server.clients);
    })
})
// 处理用户刚上线时发送的userID/toUserID
async function handelCurrConnect(data,ws){
    let {flag,userID,toUserID} = data
    // 初始化连接
    if(flag!== 'init_connection'){
        return false
    }
    // 给当前客户端连接添加唯一标识
    ws.userID = userID;
    // 存储当前用户ws连接
    Connects.set(userID,ws);
    // 修改当前用户state:1
    UpdateUserState(userID,1).then(()=>{
        console.log('用户在线状态修改成功-----')
        // 有客户端上线成功-广播上线消息
        BroadCastMsg({flag:'user_connect'});
    })
}
//处理客户端发送的消息
function handelMsg(data){
    let {flag,userID,toUserID,msg} = data
    if(flag!=='msg'){
        return false
    }
    /*
    * 1：消息入库，用作历史消息存储
    * 2：将该条消息发送给toUserID
    * */
    // 消息存储数据库
    insetMsg({userID,toUserID,msg});

    // 发送toUserID
    // 获取toUserID-ws连接
    let toUserID_WS = Connects.get(toUserID);
   // console.log('toUserID_WS------',toUserID_WS)
    // 传输的每条消息：都应该有flag:'msg' / userID / toUserID
    let msg_body = {
        flag:'msg',
        userID,toUserID,
        msg
    }
    toUserID_WS.send(JSON.stringify(data));
    console.log('发送消息------',JSON.stringify(data))
}
// 给在线用户广播消息
function BroadCastMsg(data){
    // 有客户端上线成功-广播用户下线消息
    server.clients.forEach(function each(client){
        // 筛选出在线用户
        if(client.readyState === WebSocket.OPEN){
            client.send(JSON.stringify(data));
        }
    })
}
